package com.senmin.aPrinciple.a4OpenClosedPrinciple.fdemo1;

/**
 * @className: OpenClosedDemo1
 * @author: xpj
 * @create: 2021/6/6
 * @description: 画图形案例
 * 演示：违反了设计模式的OCP原则（违反对扩展开发，对修改关闭）
 */
public class OpenClosedDemo1 {
    public static void main(String[] args) {
        //使用看看存在的问题
        GraphicEditor graphicEditor = new GraphicEditor();
        graphicEditor.drawShape(new Rectangle());
        graphicEditor.drawShape(new Cricle());

    }
}

/**
 *这是一个用于绘图的类
 * 【这个类：就是使用方】
 * 分析问题：
 * 1.新增一个绘制三角形功能，需要在使用方：GraphicEditor类上，进行修改。违反了设计模式的OCP原则（违反对扩展开发，对修改关闭）
 */
class GraphicEditor {
    //接收Shape对象，然后根据type值，来决定绘制不不同的图形
    public void drawShape(Shape s) {
        if (s.m_type == 1) {
            DrawRectangle(s);
        }
        if (s.m_type == 2) {
            DrawCricle(s);
        }
        if (s.m_type == 3) {
            DrawTriangle(s);
        }
    }

    //这个是画矩形的实现类
    public void DrawRectangle (Shape s){
        System.out.println("绘制矩形");
    }

    //这个是画图形的实现类
    public void DrawCricle (Shape s){
        System.out.println("绘制圆形");
    }

    //这个是画图形的实现类
    public void DrawTriangle (Shape s){
        System.out.println("绘制三角形");
    }


}



/**
 * 基类：形状类
 */
class Shape{
    int m_type;

    public int getM_type() {
        return m_type;
    }

    public void setM_type(int m_type) {
        this.m_type = m_type;
    }
}

/**
 * 长方形
 */
class Rectangle extends Shape{
    Rectangle(){
        super.m_type = 1;
    }
}


/**
 * 圆形
 */
class Cricle extends Shape{
    Cricle(){
        super.m_type = 2;
    }
}


/**
 * 三角形
 */
class Triangle extends Shape{
    Triangle(){
        super.m_type = 3;
    }
}